﻿Imports Utilitario
Imports Negocio
Imports Entidad
Public Class frmCargaMasiva
    Dim elegidos As New Dictionary(Of String, TablaMasivaDetalle)
    Dim errores As New Dictionary(Of Integer, String)
    Dim campos As New List(Of TablaMasivaDetalle)
    Dim querys As New List(Of String)
    Public flg As String
    Public Sub cargarCamposExcel(ByVal ds As DataSet)
        lstCamposExcel.Items.Clear()
        elegidos.Clear()
        For i As Integer = 0 To ds.Tables(0).Columns.Count - 1
            lstCamposExcel.Items.Add(ds.Tables(0).Columns.Item(i).Caption)
        Next
    End Sub
    Public Sub limpiarElegidos()
        lstElegidos.Items.Clear()
        elegidos.Clear()
    End Sub
    Public Sub cargarCampos()
        lstCampos.Items.Clear()
        campos.Clear()
        Dim tblMasiva As New TablaMasivaDetalleNegocio
        campos = tblMasiva.consultarTablaMasivaDetalle(cmbArchivos.SelectedValue.ToString, flg)
        For i As Integer = 0 To campos.Count - 1
            lstCampos.Items.Add(campos(i).gTMD_Descripcion)
        Next
    End Sub

    Public Sub cargarErrores()
        lstErrores.Items.Clear()
        For i As Integer = 0 To errores.Count - 1
            lstErrores.Items.Add(errores(errores.Keys(i)))
        Next
    End Sub


    Private Sub btnExaminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExaminar.Click
        Dim oFD As New OpenFileDialog
        With oFD
            .Filter = "Archivos Excel (*.xlsx)|*.xlsx|Archivos Excel 2003(*.xls)|*.xls"
            .FileName = txtArchivo.Text
            If .ShowDialog = DialogResult.OK Then
                txtArchivo.Text = .FileName
                Dim utilExcel = New Utilitario.funcionesExcel(txtArchivo.Text)
                cmbHojas.DataSource = utilExcel.obtenerHojasExcel()
            End If

        End With
    End Sub

    Private Sub btnCargar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCargar.Click
        If chkHabilitarRango.Checked And (txtRangoDesde.Text.Trim.Equals("") Or txtRangoHasta.Text.Trim.Equals("")) Then
            MsgBox("Ingrese un rango correcto")
            Exit Sub
        End If

        Dim utilExcel = New Utilitario.funcionesExcel(txtArchivo.Text)
        Dim ds As DataSet = utilExcel.cargarExcelDatagrid(txtArchivo.Text.Trim, cmbHojas.SelectedItem, IIf(chkHabilitarRango.Checked, txtRangoDesde.Text.Trim + ":" + txtRangoHasta.Text.Trim, IIf(txtArchivo.Text.Trim.Substring(txtArchivo.Text.Trim.Length - 4) = "xlsx", "A1:XFD1048576", "A1:IV65536")))

        If Not IsNothing(ds) Then
            With dtgDatos
                .DataSource = ds
                .DataMember = ds.Tables(0).TableName
            End With
            cargarCamposExcel(ds)
        End If
        limpiarElegidos()
        cargarCampos()
        errores.Clear()
        cargarErrores()
    End Sub

    Private Sub frmCargaMasiva_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim tblMasiva As New TablaMasivaNegocio
        Dim dt As DataTable = tblMasiva.consultarTablaMasiva(flg)
        With cmbArchivos
            .DataSource = dt
            .ValueMember = dt.Columns(0).ToString
            .DisplayMember = dt.Columns(1).ToString
        End With
        If flg.Equals("0") Then
            Me.Text = "Carga Masiva - Actualizacion"
        End If
        If flg.Equals("1") Then
            Me.Text = "Carga Masiva - Nuevos Registros"
        End If
    End Sub

    Private Sub chkHabilitarRango_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkHabilitarRango.CheckedChanged
        txtRangoDesde.Enabled = False
        txtRangoHasta.Enabled = False
        If chkHabilitarRango.Checked Then
            txtRangoDesde.Enabled = True
            txtRangoHasta.Enabled = True
        End If
    End Sub

    Private Sub cmbArchivos_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbArchivos.SelectedIndexChanged
        limpiarElegidos()
        cargarCampos()
        If txtArchivo.Text <> "" Then
            Dim utilExcel = New Utilitario.funcionesExcel(txtArchivo.Text)
            Dim ds As DataSet = utilExcel.cargarExcelDatagrid(txtArchivo.Text.Trim, cmbHojas.SelectedItem, IIf(chkHabilitarRango.Checked, txtRangoDesde.Text.Trim + ":" + txtRangoHasta.Text.Trim, "A1:XFD1048576"))           
            cargarCamposExcel(ds)
        End If
        errores.Clear()
        cargarErrores()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If lstCampos.SelectedIndex = -1 Or lstCamposExcel.SelectedIndex = -1 Then
            MsgBox("Seleccione campos de ambas listas")
            Exit Sub
        End If

        lstElegidos.Items.Add(lstCampos.SelectedItem.ToString & "-" & lstCamposExcel.SelectedItem.ToString)

        elegidos.Add(lstCamposExcel.SelectedItem.ToString, campos.Item(lstCampos.SelectedIndex))
        lstCamposExcel.Items.RemoveAt(lstCamposExcel.SelectedIndex)
        campos.RemoveAt(lstCampos.SelectedIndex)
        lstCampos.Items.RemoveAt(lstCampos.SelectedIndex)
    End Sub

    Private Sub lstElegidos_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstElegidos.SelectedIndexChanged
        'If lstElegidos.Items.Count > 0 Then
        '    MsgBox(elegidos.Keys(lstElegidos.SelectedIndex))
        '    MsgBox(elegidos.Values(lstElegidos.SelectedIndex).gTMD_Codigo)
        'End If
    End Sub

    Function CampoValor(ByVal nomCampo As String, ByVal valor As String, ByVal tipoDato As String, ByVal tipo As String) As String
        ' tipo=1 une campo y valor  ; tipo=2 devuelve el valor validado
        Dim cadena As String = ""
        valor = valor.Replace("'", "")
        If tipoDato.ToUpper.Equals("CADENA") Then
            If tipo.Equals("1") Then
                cadena = nomCampo & "='" & valor & "'"
            End If
            If tipo.Equals("2") Then
                cadena = "'" & valor & "'"
            End If
        End If

        If tipoDato.ToUpper.Equals("NUMERICO") Then
            If valor.Trim.Equals("") Then
                If tipo.Equals("1") Then
                    cadena = nomCampo & "=0"
                End If
                If tipo.Equals("2") Then
                    cadena = "0"
                End If
            ElseIf IsNumeric(valor) Then
                If tipo.Equals("1") Then
                    cadena = nomCampo & "=" & valor & ""
                End If
                If tipo.Equals("2") Then
                    cadena = valor
                End If
            End If
        End If

        If tipoDato.ToUpper.Equals("FECHA") Then
            Dim dt As Date
            dt = Convert.ToDateTime(valor)
            If valor.Trim.Equals("") Then
                If tipo.Equals("1") Then
                    cadena = nomCampo & "=null"
                End If
                If tipo.Equals("2") Then
                    cadena = "null"
                End If
            Else
                If IsDate(valor) Then
                    If tipo.Equals("1") Then
                        cadena = nomCampo & "={" & Format(valor, "yyyymmdd") & "}"
                    End If
                    If tipo.Equals("2") Then
                        cadena = "{" & Format(valor, "yyyymmdd") & "}"
                    End If

                End If
            End If

        End If
        Return cadena

    End Function
    Sub verificar()

        ' flg=0 Actualiza flg=1 Ingresa
        For i As Integer = 0 To campos.Count - 1
            If campos.Item(i).gTMD_Key.Equals("1") Or campos.Item(i).gTMD_Obligatorio.Equals("1") Then
                MsgBox("El campo " & campos.Item(i).gTMD_Descripcion & " es obligatorio")
                Exit Sub
            End If
        Next
        Dim cont As Integer = 0
        For i As Integer = 0 To elegidos.Count - 1
            If elegidos.Item(elegidos.Keys(i)).gTMD_Key.Equals("0") Then
                cont = cont + 1
            End If
        Next
        If elegidos.Count = cont Then
            MsgBox("Debe elegir algún campo identificador, si no se muestra en la relación comuniquese con el administrador")
            Exit Sub
        End If
        If cont = 0 Then
            MsgBox("Debe elegir por lo menos un campo para actualizar y/o ingresar")
            Exit Sub
        End If

        Dim fecha As Date = Today.Date
        Dim fechaFormateada As String
        fechaFormateada = fecha.ToString("MM/dd/yyyy")

        Dim ejecuta As New EjecutorNegocio
        Dim archivo As Array = cmbArchivos.SelectedItem.row().itemArray()
        If archivo(2).ToString.Contains("[PERIODO]") And IsNothing(periodo) Then
            Dim frm As New frmPeriodo
            If Not (frm.ShowDialog() = DialogResult.OK) Then
                MsgBox("Se debe elegir un periodo")
                Exit Sub
            Else
                Me.MdiParent.Text = Me.MdiParent.Text & " - " & periodoV
            End If
        End If

        Dim rutaArchivo As String = archivo(2).Replace("[PERIODO]", Variables.periodo)



        Cursor.Current = Cursors.WaitCursor
        querys.Clear()
        errores.Clear()
        cargarErrores()
        For i As Integer = 0 To dtgDatos.RowCount - 1
            Dim valida As Boolean = True
            Dim condicion As String = ""
            Dim actualiza As String = ""
            'Dim campos As String = ""
            Dim valores As String = ""
            Dim camposFox As Array = archivo(4).ToString.Split(",")
            Dim valoresDefault As Array = archivo(5).ToString.Split(",")

            For j As Integer = 0 To elegidos.Count - 1
                Dim campValor As String = CampoValor(elegidos.Values(j).gTMD_Codigo, dtgDatos.Item(elegidos.Keys(j), i).Value.ToString.Trim, elegidos.Values(j).gTMD_TipoDato, "1")

                If elegidos.Values(j).gTMD_Fijo.Equals("1") Then
                    If Not dtgDatos.Item(elegidos.Keys(j), i).Value.ToString.Trim.Equals(elegidos.Values(j).gTMD_ValorFijo) Then
                        errores.Add(i, "En Fila " & i & " el Campo " & elegidos.Values(j).gTMD_Descripcion & " debe tener un valor fijo " & elegidos.Values(j).gTMD_ValorFijo)
                    End If
                End If

                If campValor.Equals("") Then
                    If valida Then
                        errores.Add(i, "En Fila " & i & " el Campo " & elegidos.Values(j).gTMD_Descripcion & " debe ser " & elegidos.Values(j).gTMD_TipoDato)
                    End If
                    valida = False
                End If

                If elegidos.Values(j).gTMD_Key.Equals("1") Then
                    condicion = condicion & campValor
                    condicion = condicion & " and "
                Else
                    actualiza = actualiza & campValor
                    actualiza = actualiza & ", "
                End If
                If flg.Equals("1") Then
                    'actualiza = actualiza & elegidos.Values(j).gTMD_Codigo
                    'actualiza = actualiza & ", "

                    For t As Integer = 0 To valoresDefault.Length - 1
                        If camposFox(t).toUpper().Equals(elegidos.Values(j).gTMD_Codigo.ToUpper) Then
                            valoresDefault(t) = CampoValor(elegidos.Values(j).gTMD_Codigo, dtgDatos.Item(elegidos.Keys(j), i).Value.ToString.Trim, elegidos.Values(j).gTMD_TipoDato, "2")
                        End If
                        If camposFox(t).toUpper().Equals("FCHPRO") Then
                            valoresDefault(t) = "{" & fechaFormateada & "}"
                        End If
                    Next
                    'valores = valores & CampoValor(elegidos.Values(j).gTMD_Codigo, dtgDatos.Item(elegidos.Keys(j), i).Value.ToString.Trim, elegidos.Values(j).gTMD_TipoDato, "2")
                    'valores = valores & ", "
                End If
            Next
            If condicion.Length > 0 Then
                condicion = condicion.Substring(0, condicion.Length - 5)
            End If
            If actualiza.Length > 0 Then
                actualiza = actualiza.Substring(0, actualiza.Length - 2)
            End If
            For t As Integer = 0 To valoresDefault.Length - 1
                valores = valores & valoresDefault(t)
                valores = valores & " ,"
            Next
            If valores.Length > 0 Then
                valores = valores.Substring(0, valores.Length - 2)
            End If


            If flg.Equals("0") Then
                If ejecuta.ExisteQuery("SELECT * FROM " & cmbArchivos.SelectedValue & IIf(condicion.Equals(""), "", " WHERE " & condicion), rutaArchivo) And valida Then
                    dtgDatos.Rows(i).DefaultCellStyle.BackColor = Color.LightGreen
                    querys.Add("UPDATE " & cmbArchivos.SelectedValue & " SET " & actualiza & ", CODUSU=99, ESTPRO='M', FCHPRO={" & fechaFormateada & "}, PASPRO='' WHERE " & condicion)
                Else
                    dtgDatos.Rows(i).DefaultCellStyle.BackColor = Color.Red
                    If valida Then
                        errores.Add(i, "En la fila " & i & " código NO Existe")
                    End If
                End If
            ElseIf flg.Equals("1") Then
                If Not (ejecuta.ExisteQuery("SELECT * FROM " & cmbArchivos.SelectedValue & IIf(condicion.Equals(""), "", " WHERE " & condicion), rutaArchivo)) And valida Then
                    dtgDatos.Rows(i).DefaultCellStyle.BackColor = Color.LightGreen
                    querys.Add("INSERT INTO " & cmbArchivos.SelectedValue & "(" & archivo(4) & ") VALUES(" & valores & ")")
                    'querys.Add("UPDATE " & cmbArchivos.SelectedValue & " SET " & actualiza & " WHERE " & condicion)
                Else
                    dtgDatos.Rows(i).DefaultCellStyle.BackColor = Color.Red
                    If valida Then
                        errores.Add(i, "En la fila " & i & " código ya Existe")
                    End If
                End If
            End If
        Next

        If errores.Count = 0 Then
            MsgBox("Revisión se realizó con Exito. Seleccione guardar para realizar los cambios")
        Else
            MsgBox("Existen problemas con la información a carga. Revisar")
            cargarErrores()
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If lstElegidos.SelectedIndex = -1 Then
            MsgBox("Seleccione un campo")
            Exit Sub
        End If

        campos.Add(elegidos.Item(elegidos.Keys(lstElegidos.SelectedIndex)))
        lstCampos.Items.Add(elegidos.Item(elegidos.Keys(lstElegidos.SelectedIndex)).gTMD_Descripcion)
        lstCamposExcel.Items.Add(elegidos.Keys(lstElegidos.SelectedIndex))

        elegidos.Remove(elegidos.Keys(lstElegidos.SelectedIndex))
        lstElegidos.Items.RemoveAt(lstElegidos.SelectedIndex)
    End Sub

    Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGrabar.Click
        If errores.Count <> 0 Then
            MsgBox("Existen problemas con la información a carga. Revisar")
            Exit Sub
        End If
        Dim ejecuta As New EjecutorNegocio
        Dim archivo As Array = cmbArchivos.SelectedItem.row().itemArray()
        Dim cont As Integer = 0

        Cursor.Current = Cursors.WaitCursor
        For i As Integer = 0 To querys.Count - 1
            cont = cont + ejecuta.EjecutaQuery(querys(i), archivo(2).Replace("[PERIODO]", Variables.periodo))
        Next
        Cursor.Current = Cursors.Default
        If cont = querys.Count Then
            MsgBox("Se grabaron todos los registros con éxito")
            dtgDatos.DataSource = Nothing
            dtgDatos.DataMember = Nothing
        End If
        querys.Clear()
    End Sub

    Private Sub lstErrores_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstErrores.SelectedIndexChanged
        If lstErrores.SelectedIndex <> -1 Then
            dtgDatos.Focus()
            dtgDatos.Rows(errores.Keys(lstErrores.SelectedIndex)).Selected = True
            dtgDatos.CurrentCell = dtgDatos.Item(0, errores.Keys(lstErrores.SelectedIndex))
        End If
    End Sub

    Private Sub dtgDatos_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dtgDatos.CellEndEdit
        If Not errores.ContainsKey(e.RowIndex) Then
            errores.Add(e.RowIndex, "En Fila " & e.RowIndex & " información ha sido modificada")
            dtgDatos.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
            cargarErrores()
        End If
    End Sub


    Private Sub btnRevisar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRevisar.Click
        verificar()
    End Sub

End Class